package wge

import (
	"fmt"
	"net/http"
	"net/url"
)

// 上下文，存储访问信息
type Context struct {
	Data		url.Values	// 请求数据	map[string][]string

	Req			*http.Request
	
	w 			http.ResponseWriter
	status		int			// 处理后的 Http返回状态
	action		Handler	// 处理函数
	handlers	[]Handler	// 中间件列表
	index		int		// 当前调用中间件的位置
}

// 传递结果，结束本次请求
func (c *Context)Result (status int, body string) {
	c.status = status
	c.w.WriteHeader(status)
	fmt.Fprint(c.w, body)
}

// 调用下一个处理函数，使用链式调用
func (c *Context) Next() {
	c.index += 1
	c.run()
}

// 执行处理函数
func (c *Context) Invoke(h Handler) {
	ret := h(c)
	if ret != nil {
		c.Result(200, ret.ToString())
	}
}

func (c *Context) run() {
	for c.index <= len(c.handlers) {
		if c.index < len(c.handlers) {
			c.Invoke(c.handlers[c.index])
		} else {
			if nil != c.action {
				c.Invoke(c.action)
			}
		}
		c.index += 1
		if c.status != 0 {
			return
		}
	}
}